library(tidyverse)
library(fs)
ngsadmix_dir <- "data/ngsadmix_all/maf_0.05" # set NGSadmix outputs directory
N_K <- 10 # set number of K run
N_reps <- 4 # set number of reps run
# pull all log files
log_files <- list.files(ngsadmix_dir, pattern = ".log", full.names = T, recursive=T)
# read in all logs
all_logs <- lapply(1:length(log_files), FUN = function(i) readLines(log_files[i]))
# make list of the line that starts with "best like=" from all logs, just target 'b'
library(stringr)
bestlikes_str_list <- sapply(1:length(log_files), FUN= function(x) all_logs[[x]][which(str_sub(all_logs[[x]], 1, 1) == 'b')])
# make dataframe with 1:N_K and N_reps to add likelihood values
loglikes <- data.frame(K = rep(2:N_K, each=N_reps))
# add the log likelihood (first number in the string)
loglikes$loglike<-as.vector(as.numeric( sub("\\D*(\\d+).*", "\\1", bestlikes_str_list) ))
tapply(loglikes$loglike, loglikes$K, FUN= function(x) mean(abs(x))/sd(abs(x)))
2 3 4 5 6 7 8 9 10
1.314224e+03 3.724947e+08 Inf Inf 5.753390e+02 6.269528e+03 1.961828e+04 Inf Inf
alewife_palette <- c("#636c62", "#869ca8", "#a2878a", "#b6bc9f", "#ecc2a3", "#eceeed", "#242b35", "#a39faa", "#ac9b7c")
metadata <- read_csv("data/herring_metadata.csv") %>%
select(NMFS_DNA_ID,
GENUS,
SPECIES,
STATE_F,
WATERSHED,
WATER_NAME,
grouping_v3)
Rows: 94 Columns: 12── Column specification ───────────────────────────────────
Delimiter: ","
chr (11): sample, NMFS_DNA_ID, BOX_ID, BOX_POSITION, SA...
dbl (1): BATCH_ID
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gord <- c("BLUE",
"HYBR",
"GRTL",
"FINL",
"MIDL",
"CONL",
"NATLA",
"MIDA")
word <- c("Petitcodiac River",
"Hudson River",
"Lake Yonah",
"Lake Hartwell",
"Altamaha River",
"Roanoke River",
"Lake Superior",
"Lake Michigan",
"Lake Ontario",
"Canandaigua Lake",
"Cayuga Lake",
"Seneca Lake",
"Otisco Lake",
"East Grand Lake",
"Lake Champlain",
"Pattagansett Lake",
"Rogers Lake",
"Quonnipaug Lake",
"Miramichi River",
"Saco River",
"Black Creek",
"Choptank River")
labels <- read_tsv("data/admix-labels.tsv")
Rows: 23 Columns: 4── Column specification ───────────────────────────────────
Delimiter: "\t"
chr (4): grouping_v3, group_label, WATER_NAME, pop_label
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
tmp <- metadata %>%
mutate(xpos = 1:n())
group_pos <- tmp %>%
group_by(grouping_v3) %>%
summarise(midx = (min(xpos) - 0.5 + max(xpos) + 0.5)/ 2) %>%
mutate(midy = 1)
group_labels <- group_pos %>%
left_join(labels %>% group_by(grouping_v3) %>% slice(1))
Joining with `by = join_by(grouping_v3)`
K_2_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_2_rep_1/output.qopt_with_sample_names",
header = FALSE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
Error in `inner_join()`:
! Join columns in `x` must be present in the data.
✖ Problem with `sample`.
Backtrace:
1. ... %>% arrange(gfact, wfact)
5. dplyr:::inner_join.data.frame(., metadata, by = c(sample = "NMFS_DNA_ID"))
K_3_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_3_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_3_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_3_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_3_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_3_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_3_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_3_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_3_rep_1[2:4]),
col = alewife_palette,
names = K_2_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 2, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_3_rep_2[2:4]),
col = alewife_palette,
names = K_2_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 2, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_3_rep_3[2:4]),
col = alewife_palette,
names = K_2_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 2, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_3_rep_4[2:4]),
col = alewife_palette,
names = K_2_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 2, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

K_4_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_4_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_4_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_4_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_4_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_4_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_4_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_4_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_4_rep_1[2:5]),
col = alewife_palette,
names = K_4_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 4, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_4_rep_2[2:5]),
col = alewife_palette,
names = K_4_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 4, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_4_rep_3[2:5]),
col = alewife_palette,
names = K_4_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 4, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_4_rep_4[2:5]),
col = alewife_palette,
names = K_4_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 4, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

K_5_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_5_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_5_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_5_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_5_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_5_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_5_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_5_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_5_rep_1[2:6]),
col = alewife_palette,
names = K_5_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 5, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_5_rep_2[2:6]),
col = alewife_palette,
names = K_5_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 5, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_5_rep_3[2:6]),
col = alewife_palette,
names = K_5_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 5, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_5_rep_4[2:6]),
col = alewife_palette,
names = K_5_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 5, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

K_6_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_6_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_6_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_6_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_6_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_6_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_6_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_6_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_6_rep_1[2:7]),
col = alewife_palette,
names = K_6_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 6, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_6_rep_2[2:7]),
col = alewife_palette,
names = K_6_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 6, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_6_rep_3[2:7]),
col = alewife_palette,
names = K_6_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 6, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_6_rep_4[2:7]),
col = alewife_palette,
names = K_6_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 6, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

K_7_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_7_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_7_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_7_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_7_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_7_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_7_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_7_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_7_rep_1[2:8]),
col = alewife_palette,
names = K_7_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 7, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_7_rep_2[2:8]),
col = alewife_palette,
names = K_7_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 7, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_7_rep_3[2:8]),
col = alewife_palette,
names = K_7_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 7, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_7_rep_4[2:8]),
col = alewife_palette,
names = K_7_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 7, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

K_8_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_8_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_8_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_8_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_8_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_8_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_8_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_8_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_8_rep_1[2:9]),
col = alewife_palette,
names = K_8_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 8, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_8_rep_2[2:9]),
col = alewife_palette,
names = K_8_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 8, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_8_rep_3[2:9]),
col = alewife_palette,
names = K_8_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 8, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_8_rep_4[2:9]),
col = alewife_palette,
names = K_8_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 8, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

K_9_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_9_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_9_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_9_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_9_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_9_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_9_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_9_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_9_rep_1[2:10]),
col = alewife_palette,
names = K_9_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 9, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_9_rep_2[2:10]),
col = alewife_palette,
names = K_9_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 9, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_9_rep_3[2:10]),
col = alewife_palette,
names = K_9_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 9, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_9_rep_4[2:10]),
col = alewife_palette,
names = K_9_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 9, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

K_10_rep_1 <- read.table("data/ngsadmix_all/maf_0.05/K_10_rep_1/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_10_rep_2 <- read.table("data/ngsadmix_all/maf_0.05/K_10_rep_2/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_10_rep_3 <- read.table("data/ngsadmix_all/maf_0.05/K_10_rep_3/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
K_10_rep_4 <- read.table("data/ngsadmix_all/maf_0.05/K_10_rep_4/output.qopt_with_sample_names",
header = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID")) %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)
barplot(t(K_10_rep_1[2:11]),
col = alewife_palette,
names = K_10_rep_1$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 10, rep 1",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_10_rep_2[2:11]),
col = alewife_palette,
names = K_10_rep_2$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 10, rep 2",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_10_rep_3[2:11]),
col = alewife_palette,
names = K_10_rep_3$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 10, rep 3",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

barplot(t(K_10_rep_4[2:11]),
col = alewife_palette,
names = K_10_rep_4$WATER_NAME,
las = 2,
cex.names = 0.5,
main = "K 10, rep 4",
space = 0,
border = "white",
cex.axis = 0.75,
cex.lab = 1,
xpd = NA)

ngsadmix_files <- dir_ls("data/ngsadmix_all",
recurse = TRUE,
glob = "*.qopt_with_sample_names")
ngsAdmix_tib <- lapply(ngsadmix_files, function(x) {
read.table(x,
header = TRUE) %>%
pivot_longer(cols = -sample,
names_to = "Qval",
values_to = "value") %>%
mutate(path = x,
.before = sample)
}) %>%
bind_rows() %>%
filter(!is.na(value)) %>%
mutate(Qval = str_replace(Qval,
"X",
"Q")) %>%
extract(path,
into = c("K",
"rep"),
regex = ".*K_([0-9]+)_rep_([0-9]+)/.*$",
convert = TRUE) %>%
inner_join(.,
metadata,
by = c("sample" = "NMFS_DNA_ID"),
relationship = "many-to-many") %>%
mutate(gfact = factor(grouping_v3,
levels = gord),
wfact = factor(WATER_NAME,
levels = word)) %>%
arrange(gfact, wfact)

LS0tCnRpdGxlOiAiQWRtaXh0dXJlIFByb3BvcnRpb25zIgpzdWJ0aXRsZTogIkFsbCBTYW1wbGVzIgphdXRob3I6ICJIYW5hIEsuIE1veWxlIgpkYXRlOiAiMjAyNCBKdWx5IDIzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBsaWJyYXJpZXN9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGZzKQpgYGAKCmBgYHtyIGxvZ19saWtlbGlob29kc30KbmdzYWRtaXhfZGlyIDwtICJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNSIgIyBzZXQgTkdTYWRtaXggb3V0cHV0cyBkaXJlY3RvcnkKTl9LIDwtIDEwICAgICMgc2V0IG51bWJlciBvZiBLIHJ1bgpOX3JlcHMgPC0gNCAgIyBzZXQgbnVtYmVyIG9mIHJlcHMgcnVuCgojIHB1bGwgYWxsIGxvZyBmaWxlcwpsb2dfZmlsZXMgPC0gbGlzdC5maWxlcyhuZ3NhZG1peF9kaXIsIHBhdHRlcm4gPSAiLmxvZyIsIGZ1bGwubmFtZXMgPSBULCByZWN1cnNpdmU9VCkKCiMgcmVhZCBpbiBhbGwgbG9ncwphbGxfbG9ncyA8LSBsYXBwbHkoMTpsZW5ndGgobG9nX2ZpbGVzKSwgRlVOID0gZnVuY3Rpb24oaSkgcmVhZExpbmVzKGxvZ19maWxlc1tpXSkpCgojIG1ha2UgbGlzdCBvZiB0aGUgbGluZSB0aGF0IHN0YXJ0cyB3aXRoICJiZXN0IGxpa2U9IiBmcm9tIGFsbCBsb2dzLCBqdXN0IHRhcmdldCAnYicKbGlicmFyeShzdHJpbmdyKQpiZXN0bGlrZXNfc3RyX2xpc3QgPC0gc2FwcGx5KDE6bGVuZ3RoKGxvZ19maWxlcyksIEZVTj0gZnVuY3Rpb24oeCkgYWxsX2xvZ3NbW3hdXVt3aGljaChzdHJfc3ViKGFsbF9sb2dzW1t4XV0sIDEsIDEpID09ICdiJyldKQoKIyBtYWtlIGRhdGFmcmFtZSB3aXRoIDE6Tl9LIGFuZCBOX3JlcHMgdG8gYWRkIGxpa2VsaWhvb2QgdmFsdWVzCmxvZ2xpa2VzIDwtIGRhdGEuZnJhbWUoSyA9IHJlcCgyOk5fSywgZWFjaD1OX3JlcHMpKQoKIyBhZGQgdGhlIGxvZyBsaWtlbGlob29kIChmaXJzdCBudW1iZXIgaW4gdGhlIHN0cmluZykKbG9nbGlrZXMkbG9nbGlrZTwtYXMudmVjdG9yKGFzLm51bWVyaWMoIHN1YigiXFxEKihcXGQrKS4qIiwgIlxcMSIsIGJlc3RsaWtlc19zdHJfbGlzdCkgKSkKCnRhcHBseShsb2dsaWtlcyRsb2dsaWtlLCBsb2dsaWtlcyRLLCBGVU49IGZ1bmN0aW9uKHgpIG1lYW4oYWJzKHgpKS9zZChhYnMoeCkpKQpgYGAKCmBgYHtyIGRhdGFfb3JnfQphbGV3aWZlX3BhbGV0dGUgPC0gYygiIzYzNmM2MiIsICIjODY5Y2E4IiwgIiNhMjg3OGEiLCAiI2I2YmM5ZiIsICIjZWNjMmEzIiwgIiNlY2VlZWQiLCAiIzI0MmIzNSIsICIjYTM5ZmFhIiwgIiNhYzliN2MiLCAiIzNiM2EzNSIpCgptZXRhZGF0YSA8LSByZWFkX2NzdigiZGF0YS9oZXJyaW5nX21ldGFkYXRhLmNzdiIpICU+JQogIHNlbGVjdChOTUZTX0ROQV9JRCwgCiAgICAgICAgIEdFTlVTLCAKICAgICAgICAgU1BFQ0lFUywgCiAgICAgICAgIFNUQVRFX0YsIAogICAgICAgICBXQVRFUlNIRUQsIAogICAgICAgICBXQVRFUl9OQU1FLCAKICAgICAgICAgZ3JvdXBpbmdfdjMpCmdvcmQgPC0gYygiQkxVRSIsIAogICAgICAgICAgICJIWUJSIiwgCiAgICAgICAgICAgIkdSVEwiLCAKICAgICAgICAgICAiRklOTCIsIAogICAgICAgICAgICJNSURMIiwgCiAgICAgICAgICAgIkNPTkwiLCAKICAgICAgICAgICAiTkFUTEEiLCAKICAgICAgICAgICAiTUlEQSIpCndvcmQgPC0gYygiUGV0aXRjb2RpYWMgUml2ZXIiLCAKICAgICAgICAgICAiSHVkc29uIFJpdmVyIiwgCiAgICAgICAgICAgIkxha2UgWW9uYWgiLCAKICAgICAgICAgICAiTGFrZSBIYXJ0d2VsbCIsIAogICAgICAgICAgICJBbHRhbWFoYSBSaXZlciIsIAogICAgICAgICAgICJSb2Fub2tlIFJpdmVyIiwgCiAgICAgICAgICAgIkxha2UgU3VwZXJpb3IiLCAKICAgICAgICAgICAiTGFrZSBNaWNoaWdhbiIsIAogICAgICAgICAgICJMYWtlIE9udGFyaW8iLCAKICAgICAgICAgICAiQ2FuYW5kYWlndWEgTGFrZSIsIAogICAgICAgICAgICJDYXl1Z2EgTGFrZSIsIAogICAgICAgICAgICJTZW5lY2EgTGFrZSIsIAogICAgICAgICAgICJPdGlzY28gTGFrZSIsIAogICAgICAgICAgICJFYXN0IEdyYW5kIExha2UiLCAKICAgICAgICAgICAiTGFrZSBDaGFtcGxhaW4iLCAKICAgICAgICAgICAiUGF0dGFnYW5zZXR0IExha2UiLCAKICAgICAgICAgICAiUm9nZXJzIExha2UiLCAKICAgICAgICAgICAiUXVvbm5pcGF1ZyBMYWtlIiwgCiAgICAgICAgICAgIk1pcmFtaWNoaSBSaXZlciIsIAogICAgICAgICAgICJTYWNvIFJpdmVyIiwgCiAgICAgICAgICAgIkJsYWNrIENyZWVrIiwgCiAgICAgICAgICAgIkNob3B0YW5rIFJpdmVyIikKCmxhYmVscyA8LSByZWFkX3RzdigiZGF0YS9hZG1peC1sYWJlbHMudHN2IikgCgp0bXAgPC0gbWV0YWRhdGEgJT4lCiAgbXV0YXRlKHhwb3MgPSAxOm4oKSkKCmdyb3VwX3BvcyA8LSB0bXAgJT4lCiAgZ3JvdXBfYnkoZ3JvdXBpbmdfdjMpICU+JQogIHN1bW1hcmlzZShtaWR4ID0gKG1pbih4cG9zKSAtIDAuNSArIG1heCh4cG9zKSArIDAuNSkvIDIpICU+JQogIG11dGF0ZShtaWR5ID0gMSkKCmdyb3VwX2xhYmVscyA8LSBncm91cF9wb3MgJT4lCiAgbGVmdF9qb2luKGxhYmVscyAlPiUgZ3JvdXBfYnkoZ3JvdXBpbmdfdjMpICU+JSBzbGljZSgxKSkKYGBgCgpgYGB7ciBLMn0KS18yX3JlcF8xIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfMl9yZXBfMS9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1zYW1wbGUsIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJRdmFsIiwgCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIpCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzJfcmVwXzIgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS18yX3JlcF8yL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS18yX3JlcF8zIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfMl9yZXBfMy9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfMl9yZXBfNCA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzJfcmVwXzQvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpiYXJwbG90KHQoS18yX3JlcF8xWzI6M10pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS18yX3JlcF8xJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDIsIHJlcCAxIiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmJhcnBsb3QodChLXzJfcmVwXzJbMjozXSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzJfcmVwXzIkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgMiwgcmVwIDIiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQoKYmFycGxvdCh0KEtfMl9yZXBfM1syOjNdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfMl9yZXBfMyRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyAyLCByZXAgMyIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS18yX3JlcF80WzI6M10pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS18yX3JlcF80JFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDIsIHJlcCA0IiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmBgYAoKYGBge3IgSzN9CktfM19yZXBfMSA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzNfcmVwXzEvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzNfcmVwXzIgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS18zX3JlcF8yL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS18zX3JlcF8zIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfM19yZXBfMy9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfM19yZXBfNCA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzNfcmVwXzQvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpiYXJwbG90KHQoS18zX3JlcF8xWzI6NF0pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS18zX3JlcF8xJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDIsIHJlcCAxIiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmJhcnBsb3QodChLXzNfcmVwXzJbMjo0XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzNfcmVwXzIkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgMiwgcmVwIDIiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQoKYmFycGxvdCh0KEtfM19yZXBfM1syOjRdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfM19yZXBfMyRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyAyLCByZXAgMyIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS18zX3JlcF80WzI6NF0pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS18zX3JlcF80JFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDIsIHJlcCA0IiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKYGBgCgpgYGB7ciBLNH0KS180X3JlcF8xIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfNF9yZXBfMS9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfNF9yZXBfMiA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzRfcmVwXzIvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzRfcmVwXzMgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS180X3JlcF8zL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS180X3JlcF80IDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfNF9yZXBfNC9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCmJhcnBsb3QodChLXzRfcmVwXzFbMjo1XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzRfcmVwXzEkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgNCwgcmVwIDEiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQoKYmFycGxvdCh0KEtfNF9yZXBfMlsyOjVdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfNF9yZXBfMiRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA0LCByZXAgMiIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS180X3JlcF8zWzI6NV0pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS180X3JlcF8zJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDQsIHJlcCAzIiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmJhcnBsb3QodChLXzRfcmVwXzRbMjo1XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzRfcmVwXzQkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgNCwgcmVwIDQiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQpgYGAKCmBgYHtyIEs1fQpLXzVfcmVwXzEgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS181X3JlcF8xL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS181X3JlcF8yIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfNV9yZXBfMi9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfNV9yZXBfMyA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzVfcmVwXzMvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzVfcmVwXzQgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS181X3JlcF80L291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKYmFycGxvdCh0KEtfNV9yZXBfMVsyOjZdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfNV9yZXBfMSRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA1LCByZXAgMSIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS181X3JlcF8yWzI6Nl0pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS181X3JlcF8yJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDUsIHJlcCAyIiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmJhcnBsb3QodChLXzVfcmVwXzNbMjo2XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzVfcmVwXzMkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgNSwgcmVwIDMiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQoKYmFycGxvdCh0KEtfNV9yZXBfNFsyOjZdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfNV9yZXBfNCRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA1LCByZXAgNCIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCmBgYAoKYGBge3IgSzZ9CktfNl9yZXBfMSA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzZfcmVwXzEvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzZfcmVwXzIgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS182X3JlcF8yL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS182X3JlcF8zIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfNl9yZXBfMy9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfNl9yZXBfNCA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzZfcmVwXzQvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpiYXJwbG90KHQoS182X3JlcF8xWzI6N10pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS182X3JlcF8xJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDYsIHJlcCAxIiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmJhcnBsb3QodChLXzZfcmVwXzJbMjo3XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzZfcmVwXzIkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgNiwgcmVwIDIiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQoKYmFycGxvdCh0KEtfNl9yZXBfM1syOjddKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfNl9yZXBfMyRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA2LCByZXAgMyIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS182X3JlcF80WzI6N10pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS182X3JlcF80JFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDYsIHJlcCA0IiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKYGBgCgpgYGB7ciBLN30KS183X3JlcF8xIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfN19yZXBfMS9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfN19yZXBfMiA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzdfcmVwXzIvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzdfcmVwXzMgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS183X3JlcF8zL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS183X3JlcF80IDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfN19yZXBfNC9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCmJhcnBsb3QodChLXzdfcmVwXzFbMjo4XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzdfcmVwXzEkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgNywgcmVwIDEiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQoKYmFycGxvdCh0KEtfN19yZXBfMlsyOjhdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfN19yZXBfMiRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA3LCByZXAgMiIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS183X3JlcF8zWzI6OF0pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS183X3JlcF8zJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDcsIHJlcCAzIiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmJhcnBsb3QodChLXzdfcmVwXzRbMjo4XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzdfcmVwXzQkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgNywgcmVwIDQiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQpgYGAKCmBgYHtyIEs4fQpLXzhfcmVwXzEgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS184X3JlcF8xL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS184X3JlcF8yIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfOF9yZXBfMi9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfOF9yZXBfMyA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzhfcmVwXzMvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzhfcmVwXzQgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS184X3JlcF80L291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKYmFycGxvdCh0KEtfOF9yZXBfMVsyOjldKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfOF9yZXBfMSRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA4LCByZXAgMSIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS184X3JlcF8yWzI6OV0pLCAKICAgICAgICBjb2wgPSBhbGV3aWZlX3BhbGV0dGUsIAogICAgICAgIG5hbWVzID0gS184X3JlcF8yJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDgsIHJlcCAyIiwgCiAgICAgICAgc3BhY2UgPSAwLCAKICAgICAgICBib3JkZXIgPSAid2hpdGUiLCAKICAgICAgICBjZXguYXhpcyA9IDAuNzUsIAogICAgICAgIGNleC5sYWIgPSAxLCAKICAgICAgICB4cGQgPSBOQSkKCmJhcnBsb3QodChLXzhfcmVwXzNbMjo5XSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzhfcmVwXzMkV0FURVJfTkFNRSwgCiAgICAgICAgbGFzID0gMiwgCiAgICAgICAgY2V4Lm5hbWVzID0gMC41LCAKICAgICAgICBtYWluID0gIksgOCwgcmVwIDMiLCAKICAgICAgICBzcGFjZSA9IDAsIAogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIsIAogICAgICAgIGNleC5heGlzID0gMC43NSwgCiAgICAgICAgY2V4LmxhYiA9IDEsIAogICAgICAgIHhwZCA9IE5BKQoKYmFycGxvdCh0KEtfOF9yZXBfNFsyOjldKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfOF9yZXBfNCRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA4LCByZXAgNCIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCmBgYAoKYGBge3IgSzl9CktfOV9yZXBfMSA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzlfcmVwXzEvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzlfcmVwXzIgPC0gcmVhZC50YWJsZSgiZGF0YS9uZ3NhZG1peF9hbGwvbWFmXzAuMDUvS185X3JlcF8yL291dHB1dC5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpICU+JQogIGlubmVyX2pvaW4oLiwgCiAgICAgICAgICAgICBtZXRhZGF0YSwgCiAgICAgICAgICAgICBieSA9IGMoInNhbXBsZSIgPSAiTk1GU19ETkFfSUQiKSkgJT4lCiAgbXV0YXRlKGdmYWN0ID0gZmFjdG9yKGdyb3VwaW5nX3YzLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZ29yZCksIAogICAgICAgICB3ZmFjdCA9IGZhY3RvcihXQVRFUl9OQU1FLCAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gd29yZCkpICU+JQogIGFycmFuZ2UoZ2ZhY3QsIHdmYWN0KQoKS185X3JlcF8zIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfOV9yZXBfMy9vdXRwdXQucW9wdF93aXRoX3NhbXBsZV9uYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIikpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKCktfOV9yZXBfNCA8LSByZWFkLnRhYmxlKCJkYXRhL25nc2FkbWl4X2FsbC9tYWZfMC4wNS9LXzlfcmVwXzQvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpiYXJwbG90KHQoS185X3JlcF8xWzI6MTBdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfOV9yZXBfMSRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA5LCByZXAgMSIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS185X3JlcF8yWzI6MTBdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfOV9yZXBfMiRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA5LCByZXAgMiIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS185X3JlcF8zWzI6MTBdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfOV9yZXBfMyRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA5LCByZXAgMyIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS185X3JlcF80WzI6MTBdKSwgCiAgICAgICAgY29sID0gYWxld2lmZV9wYWxldHRlLCAKICAgICAgICBuYW1lcyA9IEtfOV9yZXBfNCRXQVRFUl9OQU1FLCAKICAgICAgICBsYXMgPSAyLCAKICAgICAgICBjZXgubmFtZXMgPSAwLjUsIAogICAgICAgIG1haW4gPSAiSyA5LCByZXAgNCIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCmBgYAoKYGBge3IgSzEwfQpLXzEwX3JlcF8xIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfMTBfcmVwXzEvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzEwX3JlcF8yIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfMTBfcmVwXzIvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzEwX3JlcF8zIDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfMTBfcmVwXzMvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpLXzEwX3JlcF80IDwtIHJlYWQudGFibGUoImRhdGEvbmdzYWRtaXhfYWxsL21hZl8wLjA1L0tfMTBfcmVwXzQvb3V0cHV0LnFvcHRfd2l0aF9zYW1wbGVfbmFtZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgaW5uZXJfam9pbiguLCAKICAgICAgICAgICAgIG1ldGFkYXRhLCAKICAgICAgICAgICAgIGJ5ID0gYygic2FtcGxlIiA9ICJOTUZTX0ROQV9JRCIpKSAlPiUKICBtdXRhdGUoZ2ZhY3QgPSBmYWN0b3IoZ3JvdXBpbmdfdjMsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBnb3JkKSwgCiAgICAgICAgIHdmYWN0ID0gZmFjdG9yKFdBVEVSX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB3b3JkKSkgJT4lCiAgYXJyYW5nZShnZmFjdCwgd2ZhY3QpCgpiYXJwbG90KHQoS18xMF9yZXBfMVsyOjExXSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzEwX3JlcF8xJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDEwLCByZXAgMSIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS18xMF9yZXBfMlsyOjExXSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzEwX3JlcF8yJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDEwLCByZXAgMiIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS18xMF9yZXBfM1syOjExXSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzEwX3JlcF8zJFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDEwLCByZXAgMyIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCgpiYXJwbG90KHQoS18xMF9yZXBfNFsyOjExXSksIAogICAgICAgIGNvbCA9IGFsZXdpZmVfcGFsZXR0ZSwgCiAgICAgICAgbmFtZXMgPSBLXzEwX3JlcF80JFdBVEVSX05BTUUsIAogICAgICAgIGxhcyA9IDIsIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSwgCiAgICAgICAgbWFpbiA9ICJLIDEwLCByZXAgNCIsIAogICAgICAgIHNwYWNlID0gMCwgCiAgICAgICAgYm9yZGVyID0gIndoaXRlIiwgCiAgICAgICAgY2V4LmF4aXMgPSAwLjc1LCAKICAgICAgICBjZXgubGFiID0gMSwgCiAgICAgICAgeHBkID0gTkEpCmBgYAoKYGBge3J9Cm5nc2FkbWl4X2ZpbGVzIDwtIGRpcl9scygiZGF0YS9uZ3NhZG1peF9hbGwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2IgPSAiKi5xb3B0X3dpdGhfc2FtcGxlX25hbWVzIikKCm5nc0FkbWl4X3RpYiA8LSBsYXBwbHkobmdzYWRtaXhfZmlsZXMsIGZ1bmN0aW9uKHgpIHsKICByZWFkLnRhYmxlKHgsIAogICAgICAgICAgICAgaGVhZGVyID0gVFJVRSkgJT4lCiAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zYW1wbGUsIAogICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlF2YWwiLCAKICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICAgIG11dGF0ZShwYXRoID0geCwgCiAgICAgICAgICAgLmJlZm9yZSA9IHNhbXBsZSkKfSkgJT4lCiAgYmluZF9yb3dzKCkgJT4lCiAgZmlsdGVyKCFpcy5uYSh2YWx1ZSkpICU+JQogIG11dGF0ZShRdmFsID0gc3RyX3JlcGxhY2UoUXZhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlEiKSkgJT4lCiAgZXh0cmFjdChwYXRoLCAKICAgICAgICAgIGludG8gPSBjKCJLIiwgCiAgICAgICAgICAgICAgICAgICAicmVwIiksIAogICAgICAgICAgcmVnZXggPSAiLipLXyhbMC05XSspX3JlcF8oWzAtOV0rKS8uKiQiLCAKICAgICAgICAgIGNvbnZlcnQgPSBUUlVFKSAlPiUKICBpbm5lcl9qb2luKC4sIAogICAgICAgICAgICAgbWV0YWRhdGEsIAogICAgICAgICAgICAgYnkgPSBjKCJzYW1wbGUiID0gIk5NRlNfRE5BX0lEIiksIAogICAgICAgICAgICAgcmVsYXRpb25zaGlwID0gIm1hbnktdG8tbWFueSIpICU+JQogIG11dGF0ZShnZmFjdCA9IGZhY3Rvcihncm91cGluZ192MywgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGdvcmQpLCAKICAgICAgICAgd2ZhY3QgPSBmYWN0b3IoV0FURVJfTkFNRSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHdvcmQpKSAlPiUKICBhcnJhbmdlKGdmYWN0LCB3ZmFjdCkKYGBgCgpgYGB7cn0KZ2dwbG90KG5nc0FkbWl4X3RpYikgKwogIGdlb21fY29sKG1hcHBpbmcgPSBhZXMoeCA9IHNhbXBsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gdmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IFF2YWwpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYWxld2lmZV9wYWxldHRlKSArIAogIHNjYWxlX3hfZGlzY3JldGUobGFiZWwgPSBtZXRhZGF0YSRXQVRFUl9OQU1FKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkgKwogIGZhY2V0X2dyaWQoSyB+IHJlcCkKYGBgCgo=